package com.aaa.tars.task;

import com.aaa.tars.entity.Order;
import com.aaa.tars.service.OrderService;
import com.aaa.tars.util.OrderStateEnum;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.util.Date;
import java.util.List;

/**
 * 订单超时处理定时任务
 * 处理超过2分钟仍未支付的订单，将其状态设置为"付款超时结束"
 */
@Slf4j
@Component
public class OrderTimeoutTask {

    @Autowired
    private OrderService orderService;

    /**
     * 定时检查订单超时情况
     * 每分钟执行一次
     */
    @Scheduled(fixedRate = 60 * 1000) // 每60秒执行一次
    public void processTimeoutOrders() {
        try {
            log.info("开始执行订单超时检查任务");

            // 获取2分钟前的时间点
            Date thresholdTime = new Date(System.currentTimeMillis() - 2 * 60 * 1000);
            
            // 查询所有2分钟前创建且状态为待付款的订单
            List<Order> timeoutOrders = orderService.queryByOrderStateAndCreateTimeBefore(
                    OrderStateEnum.WAIT_PAY.getCode(), thresholdTime);

            if (timeoutOrders != null && !timeoutOrders.isEmpty()) {
                log.info("找到 {} 个超时未支付订单，开始处理", timeoutOrders.size());

                for (Order order : timeoutOrders) {
                    try {
                        // 更新订单状态为"付款超时结束"
                        orderService.updateOrderStateByNo(order.getOrderNo(), OrderStateEnum.CANCEL_PAY_TIMEOUT);
                        log.info("订单 {} 已超时2分钟，状态已更新为'付款超时结束'", order.getOrderNo());
                    } catch (Exception e) {
                        log.error("更新订单 {} 状态时出错: {}", order.getOrderNo(), e.getMessage(), e);
                    }
                }
            } else {
                log.info("没有超时未支付的订单需要处理");
            }

            log.info("订单超时检查任务执行完成");
        } catch (Exception e) {
            log.error("执行订单超时检查任务时出错: {}", e.getMessage(), e);
        }
    }
}